gusucode.com > 各种VC自绘控件源码程序 > 各种VC自绘控件源码/code/SkinControls(自绘MFC基本控件 )/SkinControls/SkinControls/SkinEdit.cpp

    
#include "stdafx.h"
#include "SkinEdit.h"

//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////

IMPLEMENT_DYNAMIC(CSkinEdit, CEdit)

BEGIN_MESSAGE_MAP(CSkinEdit, CEdit)
	ON_WM_CTLCOLOR_REFLECT()
	ON_WM_KEYDOWN()
	ON_WM_SETFOCUS()
	ON_WM_LBUTTONDOWN()
	ON_WM_MBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_WM_NCPAINT()
	ON_WM_KILLFOCUS()
END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////

//构造函数
CSkinEdit::CSkinEdit():	m_bFirstTime(TRUE),m_strPromptText(TEXT("")),m_crPromptColor(RGB(255,153,0))
{
	m_crFrameColor = RGB(40,138,228);
	m_brush.CreateSolidBrush(GetSysColor(COLOR_WINDOW));
}

//析构函数
CSkinEdit::~CSkinEdit()
{
	m_brush.DeleteObject();
}

void CSkinEdit::SetPromptColor(COLORREF crText)
{
	m_crPromptColor = crText; 
}

void CSkinEdit::SetPromptText(LPCTSTR lpszPrompt)
{ 
	m_strPromptText = lpszPrompt;
	if (m_strPromptText.IsEmpty())
		m_bFirstTime = FALSE;
	if (m_bFirstTime)
		SetWindowText(m_strPromptText);
}

void CSkinEdit::SetFrameColor(COLORREF crFrameColor)
{
	m_crFrameColor = crFrameColor;
}

void CSkinEdit::OnSetFocus(CWnd* pOldWnd) 
{
	CEdit::OnSetFocus(pOldWnd);

	if (m_bFirstTime)
	{
		SetSel(m_strPromptText.GetLength(), m_strPromptText.GetLength());
	}
}

void CSkinEdit::OnKillFocus(CWnd* pNewWnd)
{
	CEdit::OnKillFocus(pNewWnd);

	SetWindowText(m_strPromptText);
	m_bFirstTime = TRUE;
}

HBRUSH CSkinEdit::CtlColor(CDC* pDC, UINT /*nCtlColor*/) 
{
	if (m_bFirstTime)
		pDC->SetTextColor(m_crPromptColor);
	return m_brush;		
}

void CSkinEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if (m_bFirstTime)
	{
		m_bFirstTime = FALSE;
		SetWindowText(TEXT(""));
	}

	CEdit::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CSkinEdit::OnLButtonDown(UINT nFlags, CPoint point) 
{
	if (m_bFirstTime)
	{
		m_bFirstTime = FALSE;
		SetWindowText(TEXT(""));
	}

	CEdit::OnLButtonDown(nFlags, point);
}

void CSkinEdit::OnMButtonDown(UINT nFlags, CPoint point) 
{
	if (m_bFirstTime)
	{
		m_bFirstTime = FALSE;
		SetWindowText(TEXT(""));
	}

	CEdit::OnMButtonDown(nFlags, point);
}

void CSkinEdit::OnRButtonDown(UINT nFlags, CPoint point) 
{
	if (m_bFirstTime)
	{
		m_bFirstTime = FALSE;
		SetWindowText(TEXT(""));
	}

	CEdit::OnRButtonDown(nFlags, point);
}

int CSkinEdit::GetWindowText(LPTSTR lpszStringBuf, int nMaxCount) const
{
	if (m_bFirstTime)
	{
		if (lpszStringBuf && (nMaxCount > 0))
			lpszStringBuf[0] = TEXT('\0');
		return 0;
	}

	return CEdit::GetWindowText(lpszStringBuf, nMaxCount);
}


void CSkinEdit::GetWindowText(CString& rString) const
{
	if (m_bFirstTime)
		rString = TEXT("");
	else
		CEdit::GetWindowText(rString);
}

void CSkinEdit::SetWindowText(LPCTSTR lpszString)
{
	if (m_bFirstTime && (lpszString[0] == TEXT('\0')))
		return;

	if (lpszString && 
		(m_strPromptText.Compare(lpszString) != 0))
		m_bFirstTime = FALSE;

	CEdit::SetWindowText(lpszString);
}

LRESULT CSkinEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if (message == WM_SETTEXT)
	{
		TCHAR *cp = (TCHAR *) lParam;

		if (!cp)
			return TRUE;

		if (m_bFirstTime && (cp[0] == TEXT('\0')))
			return TRUE;

		if (m_strPromptText.Compare(cp) != 0)
			m_bFirstTime = FALSE;
	}
	else if (message == WM_GETTEXT)
	{
		if (m_bFirstTime)
		{
			TCHAR *cp = (TCHAR *) lParam;

			if (cp && (wParam != 0))
				*cp = TEXT('\0');

			return 0;
		}
	}

	return CEdit::DefWindowProc(message, wParam, lParam);
}

void CSkinEdit::OnNcPaint() 
{
	CEdit::OnNcPaint();

	CDC *pDC = GetWindowDC();
	CRect rectItem, pRect;
	GetWindowRect(pRect);
	GetClientRect(rectItem);

	CPen nDarkBorder, nWhiteBorder;
	nDarkBorder.CreatePen(PS_SOLID, 1, m_crFrameColor);
	nWhiteBorder.CreatePen(PS_SOLID, 1, RGB(255, 255, 255));

	rectItem.right = rectItem.left + pRect.Width();
	rectItem.bottom = rectItem.top + pRect.Height();

	CPoint TopLeft(rectItem.left, rectItem.top);
	CPoint BottomRight(rectItem.right - 1, rectItem.bottom - 1);
	CPoint TopRight(rectItem.right - 1, rectItem.top);
	CPoint BottomLeft(rectItem.left, rectItem.bottom - 1);

	pDC->SelectObject(&nDarkBorder);
	pDC->MoveTo(TopLeft);
	pDC->LineTo(TopRight);
	pDC->MoveTo(TopLeft);
	pDC->LineTo(BottomLeft);

	pDC->MoveTo(BottomLeft.x, BottomLeft.y - 1);
	pDC->LineTo(BottomRight.x, BottomRight.y - 1);
	pDC->MoveTo(BottomRight.x - 1, BottomRight.y);
	pDC->LineTo(TopRight.x - 1, TopRight.y);

	pDC->SelectObject(&nWhiteBorder);

	pDC->MoveTo(BottomLeft);
	pDC->LineTo(BottomRight);
	pDC->MoveTo(BottomRight);
	pDC->LineTo(TopRight);

	pDC->MoveTo(TopLeft.x + 1, TopLeft.y + 1);
	pDC->LineTo(TopRight.x - 1, TopRight.y + 1);
	pDC->MoveTo(TopLeft.x + 1, TopLeft.y + 1);
	pDC->LineTo(BottomLeft.x + 1, BottomLeft.y - 1);
	ReleaseDC(pDC);
}

//////////////////////////////////////////////////////////////////////////